//список названий, которые могут быть названиями мест
var placesCandidates = new Array()

//список объектов найденных мест
var places = new Array()

function ProcessLjComment(line) {
	//прогоняем строку по различным методам поиска
	ProcessUpperCaseWords(line);
	ProcessLinks(line);
	ProcessQuotes(line);
	ProcessAddresses(line);
	//print(placesCandidates);
	geocodeCandidates(placesCandidates);
	return places;
	//return "";
}

function addCandidate(line){
	//отсеиваем шлак типа адресов картинок, тэгов и путей
	if(line.search(/(.jpg)|(.gif)|(.html)|(.htm)|([<>])|(\/)/) == -1)	
		placesCandidates.push(line);
}

/*
отправляет запрос на GoogleMaps, разбирает ответ, 
если такое место нашлось, до добавляет его в места
*/
function geocodeCandidates(candidates){
	for(var i=0; i<candidates.length; i++) {
		response = GoogleMapsRequest(candidates[i]);

		response = response.slice(0, -6); //о_О в ответе окуда-то 0 в конце берётся, надо отсечь его
		responseObj = JSON.parse(response);
	
		//http://code.google.com/intl/ru/apis/maps/documentation/geocoding/#GeocodingResponses

		if (responseObj.Status.code !=200){
			print("Not found: "+candidates[i])
			continue;
		}
		
		//Нашли, но нашли всего лишь город, а не конкретное место
		var townLevelAccuracy = 4;		
		if (responseObj.Placemark[0].AddressDetails.Accuracy <= townLevelAccuracy){
			print("Only city founded: "+candidates[i])
			continue;
		}

		placeName = responseObj.name;
		address = responseObj.Placemark[0].address;
		longitude = responseObj.Placemark[0].Point.coordinates[0];
		latitude = responseObj.Placemark[0].Point.coordinates[1];

		place = {	"name": placeName,
					"address": address,
					"latitude": latitude,
					"longitude": longitude };

		//print(JSON.stringify(place));
		places.push(place);
	}
}

//Ищем все слова/словосочетания слов с большой буквы
function ProcessUpperCaseWords(line){
	//коэффициент, определяющий, насколько далеко должно быть
	//следующее слово с большой буквы, чтобы считать это 
	//одним названием.		
	var wordsDistance = 15;
	
	while(true){
		n = line.search(/[^,.?!:;<>] [A-ZА-Я].*[ .,?!/:;()]/);
	    if(n == -1) break;
	    tmp = line.slice(n+2,-1);

		//ищем следующие за ним слова с большой буквы
		n2 = tmp.search(/[^,.?!:;<>] [A-ZА-Я].*[ .,?!/:;()]/); 
		if(n2 == -1 || n2 > wordsDistance){
			n3 = tmp.search(/[ .,?!<>/()]/); //таких слов нет, ограничимся этим
			res = tmp.slice(0, n3);
			line = tmp.slice(n3+1, -1); 
		} else {
		    tmp2 = tmp.slice(n2+2,-1);  //нашли, ищем конец этой последовательности
			n3 = tmp2.search(/[ .,?!</;:()]/);
			res = tmp.slice(0, n2+2+n3); 
			line = tmp2.slice(n2+3+n3, -1);
		}

		addCandidate(res);
	}	
}

//Ищем всё <а>подписи</a> к ссылкам 
function ProcessLinks(line){
	while(true){
		n = line.search(/>[^<>]*<\/a>/);
	    if(n == -1) break;
	    tmp = line.slice(n+1,-1);
		n2 = tmp.search(/<\/a>/);
		res = tmp.slice(0, n2);
		line = tmp;
		addCandidate(res);

	}	
}	

//Ищем всё, заключённое в кавычки
function ProcessQuotes(line){
	while(true){
		n = line.search(/\"/);
	    if(n == -1) break;
	    tmp = line.slice(n+1,-1);
		n2 = tmp.search(/\"/);
		res = tmp.slice(0, n2);	
		line = tmp.slice(n2+1, -1);	
	
		//не учитываем адреса и большие строки (вероятно найденные ошибочно)
		if(res.search(/http:/) != 0 && res.length < 50) {
			addCandidate(res);
		}
	}	
}

//Ищем всё, похожее на адрес
function ProcessAddresses(line){
	while(true){
		prefixLength = 4; //длина строк 'пр. ', 'ул. ', 'пл. '
		n = line.search(/(ул\.)|(пр\.)|(пл\.) /);
	    if(n == -1) break;
	    res = line.slice(n,-1);
	    tmp = line.slice(n + prefixLength,-1);
		
		n2 = tmp.search(/[0-9]+/); //пытаемся найти номер дома
        if(n2 == -1 || n2 > 80)    //если не вышло, то цепляемся хотя бы за улицу/проспект
		{
			n2 = tmp.search(/[^A-Za-zА-Яа-я]/);
		} else {
			n2 = n2 + tmp.match(/[0-9]+/).length;
		}
		
		res = res.slice(0, n2 + prefixLength);	
		line = tmp.slice(n2 + 1, -1);			
		addCandidate(res);		
	}	
}	

/*
function ProcessLjComment(text) {
  var someAddress;
  var jsonResult = GoogleMapsRequest(someAddress);

  return [
        {
          "name": name,
          "address": address,
          "longitude": longitude,
          "latitude": latitude,
        }
      ];

}*/
